package com.littlepay.kr4.paulin.dfeba77.utils;

import com.littlepay.kr4.paulin.dfeba77.config.TransactionConfig;


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * Created by kr4 on 2017/5/18.
 *
 */

public class DBTransaction {
    private static DBTransaction per = null;
    private Connection conn = null;
    private static PreparedStatement preparedStatement = null;
    private Statement stmt = null;
    private DBTransaction(){
    }
    // 单态模式-懒汉模式
    //对于事务而言不能使用同一个stmt获取结果集，因此单态模式不能使用
    public static DBTransaction createInstance() {
        if(per == null){
            per = new DBTransaction();
            per.initDB();
        }
        return per;
    }
    // 加载驱动
    private void initDB() {
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    // 连接数据库，获取句柄+对象
    public void connectDB() {

        System.out.println("Connecting to database...");
        try {
            conn = DriverManager.getConnection(TransactionConfig.URL, TransactionConfig.USER, TransactionConfig.PASS);
            stmt = conn.createStatement();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        if (conn != null) {
            System.out.println("SqlManager:Connect to database successful.");
        } else {
            System.out.println("SqlManager:Connect to database fail.");
        }
    }

    public PreparedStatement prepareStatement(String sql){
        try {
            preparedStatement = conn.prepareStatement(sql);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return preparedStatement;
    }

//  public Statement createStatement(){
//      Statement stmt = null;
//      try{
//          stmt = conn.createStatement();
//      }catch (Exception e){
//          e.printStackTrace();
//      }
//      return stmt;
//  }



    // 关闭数据库 关闭对象，释放句柄
     public void closeDB() {
         System.out.println("Close connection to database..");
         try {
             stmt.close();
             preparedStatement.close();
             conn.close();
         } catch (SQLException e) {
             e.printStackTrace();
         }
         System.out.println("Close connection successful");
     }
     //设定事务提交模式
     public void setAutoCommit(Boolean sql){
         try {
             conn.setAutoCommit(sql);
         }catch (SQLException e) {
             e.printStackTrace();
         }
     }
    //提交修改，只有不是自动提交才使用
    public  void commit(){
        try {
            conn.commit();
        }catch (SQLException e) {
            e.printStackTrace();
        }
    }
    //回滚修改，出现错误后使用，只有不是自动提交才使用
    public  void  rollback(){
        try {
            conn.rollback();
        }catch (SQLException e) {
            e.printStackTrace();
        }
    }
    /*execute()方法返回值不同，使用方式也不同
    * 返回值为true时，表示执行的查询语句，使用getResultSet方法获取结果；
    * 返回值为false时，表示执行更新或DDL （数据定义语言）语句，使用getUpdateCount获取结果。
    * 且executeUpdate函数和execute函数会自动返回resultSet！*/
    public Boolean execute(String sql) {
        Boolean ret = true;
        //成功插入为false
        try {
            ret = stmt.execute(sql);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return ret;
    }
    //删除
    public int executeUpdate(String sql) {
        int ret = 0;
        try {
            ret = stmt.executeUpdate(sql);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return ret;
    }
    //查询
    public ResultSet executeQuery(String sql) {
        ResultSet rs = null;
        try {
            if(sql != null)
                rs = stmt.executeQuery(sql);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return rs;
    }

}





